package com.eugeneMa.util;

import com.eugeneMa.enumEntity.DateFormatEnum;
import org.apache.log4j.Logger;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 日期工具类，包括日期与字符串的相互转换等
 *
 * @author Eugenema
 * @date 2022/2/12 23:43
 */
public class DateUtil {
    /** 日志 */
    private static Logger logger = Logger.getLogger(DateUtil.class);
    /** 日期格式化 */
    private static SimpleDateFormat dateFormat;

    /** 字符串转日期分隔符 */
    public static final String STRINGTODATE_SPLIT = ":";
    /** 字符串转日期单位：年月日时分秒 */
    public static final Integer[] STRINGTODATE_UNIT = {Calendar.YEAR, Calendar.MONTH, Calendar.DAY_OF_MONTH,
                                                        Calendar.HOUR_OF_DAY, Calendar.MINUTE, Calendar.SECOND};

    //正则
    /** 时:分【mm:dd】 */
    public static final String REGEX_HOURMINUTE_NOSPLIT = "([0-1]?[0-9]|2[0-3]):([0-5][0-9])$";


    /**
     * 日期转字符串
     *
     * @author Eugenema
     * @date 2022/2/13 8:58
     *
     * @param date 要转换的日期
     * @param format 转换的格式
     *
     * @return 转换后的字符串，若异常或参数为空，则返回空字符串
     **/
    public static String dateToString(Date date, DateFormatEnum format) {
        try {
            //校验参数
            if(date == null || format == null) {
                return "";
            }

            //日期转换
            dateFormat = new SimpleDateFormat(format.getValue());
            return dateFormat.format(date);
        } catch (Exception e) {
            logger.error("日期转换字符串异常，date：【" + date + "】，format：【" + format + "】", e);
            return "";
        }
    }

    /**
     * 校验字符串
     *
     * @author Eugenema
     * @date 2022/4/4 13:41
     *
     * @param str 要校验的字符串
     * @param regex 正则表达式
     *
     * @return str为null或空串，返回false；符合正则的，返回true
     **/
    public static boolean matchesDateString (String str, String regex) {
        //校验参数
        if (StringUtil.isEmpty(str)) {
            return false;
        }
        return str.matches(regex);
    }
    
    /**
     * 字符串转日期
     *
     * @author Eugenema
     * @date 2022/4/4 15:51
     *
     * @param str 要转换的字符串，格式：yyyy:MM:dd:HH:mm:ss（年月日时分秒），若某个字段无值，则空出来即可（:::HH:mm:ss 时分秒)
     *
     * @return 日期对象，若参数有误或异常，返回null
     **/
    public static Date stringToDate (String str) {
        //校验参数
        if (StringUtil.isEmpty(str) || StringUtil.splitString(str, STRINGTODATE_SPLIT).length != STRINGTODATE_UNIT.length) {
            return null;
        }

        //分割参数
        String[] params = StringUtil.splitString(str, STRINGTODATE_SPLIT);

        //年月日不能为0
        for (int i = 0; i < 3; i++) {
            if(!StringUtil.isEmpty(params[i]) && Integer.parseInt(params[i]) == 0) {
                return null;
            }
        }

        //日历对象
        Calendar calendar = Calendar.getInstance();
        for (int i = 0; i < params.length; i++) {
            if (!StringUtil.isEmpty(params[i])) {
                calendar.set(STRINGTODATE_UNIT[i], Integer.parseInt(params[i]));
            }
        }
        //月份需要减一
        if (calendar.get(Calendar.MONTH) != Calendar.getInstance().get(Calendar.MONTH)) {
            calendar.add(Calendar.MONTH, -1);
        }
        return calendar.getTime();
    }

    public static void main(String[] args) {
        for (String s : ":::21:08:".split(STRINGTODATE_SPLIT)) {
            System.out.println(s);
        }
        System.out.println(":::21:08:".split(STRINGTODATE_SPLIT).length);
        System.out.println(dateToString(stringToDate(":::21:08:"), DateFormatEnum.DATETIME));

        String s = ":123:456:789:";
        String[] split = s.split(":");
        for (String s1 : split) {
            System.out.println("i" + s1);
        }
    }
}
